python grpc如何给proto文件中map类型的变量赋值?

您所在的位置:网站首页 protoc python python grpc如何给proto文件中map类型的变量赋值?

python grpc如何给proto文件中map类型的变量赋值?

2023-04-17 19:05| 来源: 网络整理| 查看: 265

python grpc如何给proto文件中map类型的变量赋值?,第1张

改完之后,你可以选择project-clean,clean后你项目的R.java文件就会重新生成,所有的资源ID会重新分配,这乱枣册样子你所修改的资源才能被Android真正识别,有时这个操作不是必要的,但是如果出现你修改了资源后,你的项目中出现了一些问题,那么执行Clean是一个必须的选择,这些资源包括岩含drawable下的图片,布局哗宏里id的修改,values下资源的修改,你可以着手试一下 Good luck客户方像挪用当地办法同样去挪用长途接口办法,RPC 结构供给接口的署理完成,理论的挪用将拜托给署理RpcProxy

。署理封装挪用资讯并将挪用转交给RpcInvoker 去理论履行。在客户真个RpcInvoker 经过衔接器RpcConnector

去保持与效劳端的通道RpcChannel,并运用RpcProtocol

履行协定编码(encode)并将编码后的恳求音讯经过通道发送给效劳方。RPC 效劳端接纳器 RpcAcceptor

接纳客户真个挪用恳求,一样运用RpcProtocol 履行协定解码(decode)。解码后的挪用资讯传送给RpcProcessor

去掌握处置挪用进程,末了再拜托挪用给RpcInvoker 去理论履行并前往挪用后果。

protobuf

rpc在下面组件中首要表演RpcProtocol的人物,使得咱们省去了协定的描绘,而且protobuf协定在编码和时间效力都是上十分高效的,这也是许多公司选用protobuf作为数值序列化和通讯协议的起因。一起protobuf

rpc界说了一个笼统的rpc结构,以下图所示:

RpcServiceStub和RpcService类是protobuf编派芹枣译器依据proto界说天生的类,RpcService界说了效劳端表露给客户真个函数接口,详细完成需求用户本人担当这个类来完成。RpcServiceStub界说了效劳端表露函数的描绘,并将客户端对RpcServiceStub中函数的挪用同一转换到挪用RpcChannel中的CallMethod办法,CallMethod经过RpcServiceStub传过去的函数描绘符和函数参数对该次rpc挪用停止encode,最后经过RpcConnecor发送给效劳方。自己以客首燃户端相反的进程最后挪用RpcSerivice中界说的函数。现实上,protobuf

rpc的结构仅仅RpcChannel中界说了空的CallMethod,以是详细怎么样停止encode和挪用RpcConnector都要本人完成。RpcConnector在protobuf中没有界说,以是这个完结由用户本人完成,它的效果那是收发rpc音讯包。在效劳端,RpcChannel经过挪用RpcService中的CallMethod来详细挪用RpcService中表露给客户真个函数。

引见了这么多,关于怎样用protobuf rpc来完成一个rpc确定仍是一头雾水吧,下面就用protobuf rpc来完成一个简略的python版rpc demo吧。

下面间接给出demo描绘PRC的proto文件,至于proto文件的编写规定能够参考protobuf官网。

common.proto文件:

package game

message RequestMessage

{

required string message = 1

}

message ResponseMessage

{

required string message = 1

}

game_service.proto文件:

package game

import "common.proto"

option py_generic_services = true

service GameService

{

rpc connect_server(RequestMessage) returns(RequestMessage)

}

common.proto文件描绘了RPC中收发的音讯;game_service.proto描绘了效劳器导出的connect_server函数,该函数承受RequestMessage目标作为参数,并前往RequestMessage目标。在运用PRC协定时,必需加之option

py_generic_services =

true可选项,要否则编译器不会天生蕴含connect_server函数的GameService描绘。

运用编译器protoc编译proto文件,详细号令为:

protoc.exe --python_out=. game_service.proto

编尘拆译后天生的文件为game_service_pb2.py,该文件首要是完成了GameService和GameService_Stub类。GameService_Stub类用于客户端挪用者来挪用GameService的效劳。

后面曾经说了,在客户端,RpcChannel只完成了一个空的CallMethod,以是需求担当RpcChannel从新这个函数来encode音讯和发送音讯。在效劳端RpcChannel需求挪用CallMethod来挪用Service中的函数。详细完成以下:

class MyRpcChannel(service.RpcChannel):

def __init__(self, rpc_service, conn):

super(MyRpcChannel, self).__init__()

self.logger = LogManager.get_logger("MyRpcChannel")

def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done):

""""protol buffer rpc 需求的函数,用来发送rpc挪用"""

self.logger.info('CallMethod')

cmd_index = method_descriptor.index

assert(cmd_index 65535)

data = request.SerializeToString()

total_len = len(data) + 2

self.conn.send_data(''.join([pack('I', total_len), pack('H', cmd_index), data]))

def from_request(self):

""""从收集剖析出一个完好的恳求以后调的函数"""

index_data = self.rpc_request.data[0:2]

cmd_index = unpack('H', index_data)[0]

rpc_service = self.rpc_service

s_descriptor = rpc_service.GetDescriptor()

method = s_descriptor.methods[cmd_index]

try:

request = rpc_service.GetRequestClass(method)()

serialized = self.rpc_request.data[2:]

request.ParseFromString(serialized)

rpc_service.CallMethod(method, self.controller, request, None)

except:

self.logger.error("Call rpc method failed!")

self.logger.log_last_except()

return True

末了那是担当GameService,并完成connect_server函数了。

class GameService(game_service_pb2.GameService):

def __init__(self):

self.logger = LogManager.get_logger("GameService")

def connect_server(self, rpc_controller, request, callback):

self.logger.info('%s', requesssage)

至于用于收集收发音讯的RpcConnector,可使用python的asyncore库完成,详细完成在这就不评论了。

从下面的完成来看,protobuf rpc的完成首要囊括编写proto文件并编译天生对应的service_pb2文件,担当RpcChannel并完成CallMethod和挪用Service的CallMethod,担当Service来完成表露给客户真个函数。

要使用之前先到code.google.com上搜索protocol buffer,下载到本地,解压后依次执行: ./configuremakemake checkmake install 最后一步涉及到权限,可能会需要sudo。 二、定义一个proto文件 下面依然是给出液睁尘一个简单的例子,要使用proto首先需要自己定义一个proto文件,定义一个people.proto文件,内容如下: message people{ optional string name = 1optional int32 height = 2}三、生成一个python可用的py文件 然后就是生成对应的py文件,命令如下闹禅: protoc -I=./ --python_out=./ people.proto 其中-I是source的路径,--python_out表示对应python库的生成路径,然后是对应的proto文件。当然,pb还支持c++和java,修改--python_out即可。 完成后就有对应的people_pb2.py文件了。导入后即可使用,第一次安装后直接用应该会提示:ImportError: No module named google.protobuf,这是因为找不到对应的库路径导致,到你下载的pb路径下,找到python路径,执行sudo python setup.py install,执行完后可以通过执行sudo python setup.py test检查是否有安装成功,如果最后提示 ---------------------------------------------------------------------- Ran 193 tests in 0.327sOK那么就是安装成功了,此时再导入对应的pb2.py文件即可使用。 四、导入使用的简单例子 给出一个简单的调试例子:早铅 import people_pb2 pbFirstPeople = people_pb2.people() pbFirstPeople.name = joey pbFirstPeople.height = 160 print pbFirstPeople 输出结果为:name: joey

欢迎分享,转载请注明来源:内存溢出

原文地址:https://outofmemory.cn/tougao/8173715.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3